'use strict';

const BaseController = require('./base');
const serviceName = 'memberUser';
class MemberUserController extends BaseController {
  constructor(ctx) {
    super(ctx, serviceName);
  }

  /**
   * 会员用户注册
   */
  async register() {
    const { ctx } = this;
    const { phone, password, code } = ctx.request.body;
    
    // 参数验证
    if (!phone || !password) {
      return ctx.error('手机号和密码不能为空', 400);
    }
    
    if (!/^1\d{10}$/.test(phone)) {
      return ctx.error('手机号格式不正确', 400);
    }
    
    // 暂时忽略验证码验证，实际项目中需要添加
    // TODO: 验证码验证逻辑
    
    // 检查手机号是否已注册
    const existUser = await ctx.service.memberUser.findByPhone(phone);
    if (existUser) {
      return ctx.error('该手机号已注册', 400);
    }
    
    // 创建用户
    try {
      const userData = {
        phone,
        password,
        create_time: new Date(),
        update_time: new Date(),
      };
      
      const user = await ctx.service.memberUser.create(userData);
      const safeUser = ctx.service.memberUser.excludeSensitiveInfo(user.dataValues);
      
      ctx.success(safeUser);
    } catch (error) {
      ctx.logger.error('用户注册失败', error);
      ctx.error('注册失败，请稍后重试', 500);
    }
  }
  
  /**
   * 会员用户登录（手机号+密码）
   */
  async login() {
    const { ctx } = this;
    const { phone, password } = ctx.request.body;
    
    // 参数验证
    if (!phone || !password) {
      return ctx.error('手机号和密码不能为空', 400);
    }
    
    try {
      const result = await ctx.service.memberUser.login(phone, password);
      
      if (!result.success) {
        return ctx.error(result.message, 400);
      }
      
      // 生成 token
      const token = this.createToken(result.data);
      
      ctx.success({
        ...result.data,
        token,
      });
    } catch (error) {
      ctx.logger.error('用户登录失败', error);
      ctx.error('登录失败，请稍后重试', 500);
    }
  }
  
  /**
   * 微信小程序登录
   */
  async wechatLogin() {
    const { ctx } = this;
    const { code, userInfo } = ctx.request.body;
    
    if (!code) {
      return ctx.error('code不能为空', 400);
    }
    
    try {
      // 调用微信接口获取openid
      // 注意：实际项目中需要配置微信小程序的appid和secret
      // 这里简化处理，假设已获取到openid
      const openid = 'test_openid_' + Date.now(); // 测试用，实际项目需调用微信接口
      
      const result = await ctx.service.memberUser.wechatLogin(openid, userInfo);
      
      if (!result.success) {
        return ctx.error(result.message, 400);
      }
      
      // 生成 token
      const token = this.createToken(result.data);
      
      ctx.success({
        ...result.data,
        token,
      });
    } catch (error) {
      ctx.logger.error('微信登录失败', error);
      ctx.error('登录失败，请稍后重试', 500);
    }
  }
  
  /**
   * 获取用户信息
   */
  async info() {
    const { ctx } = this;
    const userId = ctx.state.user.id;
    
    try {
      const user = await ctx.service.memberUser.findById(userId);
      
      if (!user) {
        return ctx.error('用户不存在', 404);
      }
      
      const safeUser = ctx.service.memberUser.excludeSensitiveInfo(user.dataValues);
      ctx.success(safeUser);
    } catch (error) {
      ctx.logger.error('获取用户信息失败', error);
      ctx.error('获取用户信息失败', 500);
    }
  }
  
  /**
   * 更新用户信息
   */
  async updateInfo() {
    const { ctx } = this;
    const userId = ctx.state.user.id;
    const updateData = ctx.request.body;
    
    // 不允许更新的字段
    const forbiddenFields = ['id', 'openid', 'phone', 'password', 'status', 'create_time', 'update_time'];
    forbiddenFields.forEach(field => {
      delete updateData[field];
    });
    
    try {
      const user = await ctx.service.memberUser.update(userId, updateData);
      
      if (!user) {
        return ctx.error('用户不存在', 404);
      }
      
      const safeUser = ctx.service.memberUser.excludeSensitiveInfo(user.dataValues);
      ctx.success(safeUser);
    } catch (error) {
      ctx.logger.error('更新用户信息失败', error);
      ctx.error('更新用户信息失败', 500);
    }
  }
  
  /**
   * 修改密码
   */
  async changePassword() {
    const { ctx } = this;
    const userId = ctx.state.user.id;
    const { oldPassword, newPassword } = ctx.request.body;
    
    if (!oldPassword || !newPassword) {
      return ctx.error('原密码和新密码不能为空', 400);
    }
    
    try {
      const user = await ctx.service.memberUser.findById(userId);
      
      if (!user) {
        return ctx.error('用户不存在', 404);
      }
      
      // 验证原密码
      const encryptedOldPassword = ctx.service.memberUser.encryptPassword(oldPassword);
      if (user.password !== encryptedOldPassword) {
        return ctx.error('原密码错误', 400);
      }
      
      // 更新密码
      await ctx.service.memberUser.update(userId, { password: newPassword });
      
      ctx.success(null, '密码修改成功');
    } catch (error) {
      ctx.logger.error('修改密码失败', error);
      ctx.error('修改密码失败', 500);
    }
  }
  
  /**
   * 绑定手机号
   */
  async bindPhone() {
    const { ctx } = this;
    const userId = ctx.state.user.id;
    const { phone, code } = ctx.request.body;
    
    if (!phone) {
      return ctx.error('手机号不能为空', 400);
    }
    
    if (!/^1\d{10}$/.test(phone)) {
      return ctx.error('手机号格式不正确', 400);
    }
    
    // 暂时忽略验证码验证，实际项目中需要添加
    // TODO: 验证码验证逻辑
    
    try {
      // 检查手机号是否已绑定
      const existUser = await ctx.service.memberUser.findByPhone(phone);
      if (existUser && existUser.id !== userId) {
        return ctx.error('该手机号已被其他账号绑定', 400);
      }
      
      // 更新手机号
      const user = await ctx.service.memberUser.update(userId, { phone });
      
      if (!user) {
        return ctx.error('用户不存在', 404);
      }
      
      const safeUser = ctx.service.memberUser.excludeSensitiveInfo(user.dataValues);
      ctx.success(safeUser);
    } catch (error) {
      ctx.logger.error('绑定手机号失败', error);
      ctx.error('绑定手机号失败', 500);
    }
  }
  
  /**
   * 创建 token
   * @param {Object} user - 用户信息
   * @return {String} token
   */
  createToken(user) {
    const { app } = this;
    const token = app.jwt.sign({
      id: user.id,
      openid: user.openid,
      phone: user.phone,
    }, app.config.jwt.secret, {
      expiresIn: '7d', // token 有效期为 7 天
    });
    return token;
  }
}

module.exports = MemberUserController;
